/**
 * Created by dashan on 2017/3/16.
 */


//event 是所有API工作的基础模块，通过仔细查看这个Api，能够很快很好的使用其他所有的API


/*

 浏览器的event 是从DOM里面来的 ，不是javaSCript 自身带的。
 。意思是，当用户与接口的某个特定部分交互时，对应有一个事件和一个相关的对象，比如某个 HTML/XML 元素被点击或者进行了其
 他操作。该操作对象有父节点，并且可能有子节点。因为操作对象是在一棵树中，所以这个模型包含了冒泡和捕获的概念，就是允许沿
 着树的结构向上或向下的元素也接收被触发的事件。


 简单直白的讲：在 <li> 上的一个点击事件，能够被其父节点 <ul>  上绑定的监听器所捕获。反过来， <ul> 上的点击会向下冒泡传给 <li> 上的监听
器。因为 JavaScript 对象没有这一类树状结构，所以 Node 中的模型更加简单。

 浏览器中 Event 模型是绑定在 DOM 上的，

 */





/*
 所有 Node 的事件功能围绕着 EventEmitter ，因为它的设计包含了其他类扩展所需要的接口类。 EventEmitter 对象通常不会直接调用。
 EventEmitter 类提供了一系列方法，其中最主要的两个是 on 和 emit ，这些方法 供其他类使用。

//使用 on 方法监听事件
 server.on('event', function(a, b, c) {
 // 具体操作
 });


因为 EventEmitter 是接口，从 EventEmitter 继承的类需要使用 new 关键字来构造。



* */
///////////////////////////////////////////////////////////////////////////

var util = require('util'),
    EventEmitter = require('events').EventEmitter;
var Server = function() {
    console.log('init');
};

util.inherits(Server, EventEmitter);

var s = new Server();

s.on('abc', function(a,b,c) {

    console.log(arguments);

    console.log(a);
    console.log(b);
    console.log(c);

    console.log('abc');

    // handler.apply()
});

module.exports.s =s;

setInterval(function(){
    s.emit('abc',1,2,3);
},3000);

/*
    这些事件是针对某个实例的，不存在全局的事件。当
    你调用 on 方法的时候，需要绑定在特定的基于 EventEmitter 的对象上。

    Server类不同的实例之间也不会共享事件。代码中的 s 对象不会与另外一个 Server
    实例 z （比如 var z = new Server() ）共享同一个事件。
*/


/*
    比如，从 http 的事件机理！
    收到 request 请求时，你会收到两个参数：req 和 res 。
    当 request 事件被触发时，这些参数会作为第二个和第三个参数传给 emit 函数。
*/

///////////////////////////////////////////////////////////////////////////